#ifndef __NRF_PORT_H__
#define __NRF_PORT_H__

#include "user_cfg.h"
#include "app.h"
/**
 * @description: NRF2401的模块硬件脚位定义
 */
#define CE_PORT                 GPIOA
#define CE_PIN                  GPIO_Pin_8
#define IRQ_PORT                GPIOB
#define IRQ_PIN                 GPIO_Pin_11

// 拉低nrf CS，用户必须实现此宏
#define CSN_LOW()       do {GPIO_ResetBits(GPIOB, GPIO_Pin_12);} while(0)
// 拉高nrf CS，用户必须实现此宏
#define CSN_HIGH()      do {GPIO_SetBits(GPIOB, GPIO_Pin_12);} while(0)
// 拉低nrf CE，用户必须实现此宏
#define CE_LOW()        do {GPIO_ResetBits(CE_PORT, CE_PIN);} while(0)
// 拉高nrf CS，用户必须实现此宏
#define CE_HIGH()       do {GPIO_SetBits(CE_PORT, CE_PIN);} while(0)

// 关中断操作，防止在跳频中被打断，影响跳频效率
#define GZLL_INTERRUPTS_DISABLE() do{ \
    __disable_irq();\
} while(0)

// 开中断操作
#define GZLL_INTERRUPTS_ENABLE() do{  \
    __enable_irq();\
} while(0)

// CE脉冲，手册规定10us高电平就可以发送数据
#define GZLL_RFCE_PULSE() do{ \
    CE_HIGH();\
    /*delay10us(1);\*/\
    for (int i = 0; i < 1000; i++);\
    CE_LOW();\
} while(false)

// ==================================================================
/// @brief  : 向NRF写入一个值
/// @param  : value 要写入的数据
/// @returns: uint8_t 返回写入的状态
// ==================================================================
uint8_t port_nrf_write(uint8_t value);

// ==================================================================
/// @brief  : 向NRF读一个寄存器的值
/// @param  : reg 要读的寄存器
/// @returns: uint8_t 返回读到的数据
// ==================================================================
uint8_t port_nrf_read_reg(uint8_t reg);

// ==================================================================
/// @brief  : 改写NRF寄存器的值
/// @param  : reg 要改写的寄存器
/// @param  : value 要改写的数据
// ==================================================================
void port_nrf_write_reg(uint8_t reg, uint8_t value);

// ==================================================================
/// @brief  : 读多个NRF寄存器的值
/// @param  : reg 要读的寄存器
/// @param  : pbuf 缓存
/// @returns: uint16_t 寄存器+长度
// ==================================================================
uint16_t port_nrf_read_multibyte_reg(uint8_t reg, uint8_t *pbuf);

// ==================================================================
/// @brief  : 写多个个NRF寄存器的值
/// @param  : reg 要写的寄存器
/// @param  : pbuf 要写的数据
/// @param  : length 数据长度
// ==================================================================
void port_nrf_write_multibyte_reg(uint8_t reg, const uint8_t *pbuf, uint8_t length);

// ==================================================================
/// @brief  : 定时器周期设置，用户必须实现gzll需要使用，周期为us
///
/// @param  : period 定时器周期
// ==================================================================
void port_set_timer_period(uint16_t period);

// ==================================================================
/// @brief  : 获取主机的地址，传给设备使用，用户必须实现
/// @param  : buf 缓存
/// @param  : len 长度一般为5个字节
// ==================================================================
void port_host_chip_id_read(uint8_t *buf, uint8_t len);

// ==================================================================
/// @brief  : 如果用户开了软件看门狗，在配对过程中有死等情况，配对程序中需要喂狗
// ==================================================================
void port_feed_wdt(void);

// ==================================================================
/// @brief  : 主机接收延时，配对的时候做的轮询超时
/// @param  : rx_periods us延时
// ==================================================================
void port_delay_rx_periods(uint16_t rx_periods);
#endif
